read from buffer:

800A2370:
-
-
-
JAL	800A054C
LBU	S1,0010 (T9)	//S1=next character
BEQ	V0,R0,800A2394
ADDIU	AT,R0,00CD
BEQ	R0,R0,800A236C
SW	S2,02BC (S0)
//800A2394:
BNE	S1,AT,800A23C4	//if current char isn't CD (\r), branch
OR	V0,S1,R0	//V0=char

//800A23C4:	test if control char (80)
ADDIU	AT,R0,0080
BNE	V0,AT,800A23EC	//if isn't a control char, branch
LW	A1,0050 (SP)	//A1=current char offset

//800A23EC:
JAL	800A05A8	//RETURNS V0=1 if char=7F
OR	A0,S0,R0
BEQ	V0,R0,800A2438
OR	A0,S0,R0	//A0=S0=80142410

//800A2438:
LW	A1,0050 (SP)	//A1=current char offset
OR	S1,A1,R0	//S1=A1
JAL	8009DC04
OR	A0,S0,R0	//A0=80142410
LW	T5,0050 (SP)	//T5=offset to char
ADDU	T6,T5,V0	//T6=offset to next char
SW	T6,0050 (SP)	//new offset->stack
JAL	8009FAD4
SW	T6,02A0 (S0)	//new offset->801426B0
LW	T7,02BC (S0)	//T7=801426CC=0
OR	A0,S0,R0	//A0=S0
BNEL	T7,R0,800A2370
	LW	T7,000C (S0)
JAL	8009F8AC	//returns V0=1 if charval isn"t one of several values
OR	A1,S1,R0	//A1=offset to char
OR	A1,S1,R0	//A1=S1=offset to char
//800A2474:
BEQL	V0,R0,800A2490
	LW	V0,0044 (SP)
JAL	8009E6C4
OR	A0,S0,R0
//800A2484:
BEQ	R0,R0,800A2490
LW	V0,0044 (SP)
-LW	V0,0044 (SP)
//800A2490:
LW	RA,0024 (SP)
LW	S0,0018 (SP)
LW	S1,001C (SP)
LW	S2,0020 (SP)
JR	RA
ADDIU	SP,SP,0058

800A24A8:
ADDIU	SP,SP,FFE8
SW	RA,0014 (SP)
BNEZ	A1,800A24C0
ADDIU	A2,R0,0005
JAL	8009D640
OR	A1,R0,R0
//800A24C0:
LW	RA,0014 (SP)
ADDIU	SP,SP,0018
JR	RA
NOP

800A24EC:
OR	A0,S0,R0	//A0=S0=80142410
JAL	800A24A8
OR	A1,V0,R0
OR	A0,S0,R0
JAL	800A3190	//
LW	A1,0024 (SP)
LW	T6,02B4 (S0)
ADDIU	AT,R0,0003
BEQL	T6,AT,800A2528
	LW	RA,001C (SP)
LW	T7,028C (S0)
ADDIU	AT,R0,FEFF
AND	T8,T7,AT
SW	T8,028C (S0)
LW	RA,001C (SP)
LW	S0,0018 (SP)
ADDIU	SP,SP,0020
JR	RA
NOP



8009F8AC:
ADDIU	SP,SP,FFD8
SW	RA,0014 (SP)
SW	A0,0028 (SP)
SW	A1,002C (SP)
LW	T6,0028 (SP)	//T6=80142410
LW	T7,002C (SP)	//T7=char offset
LW	V0,000C (T6)	//V0=address of text block header
ADDIU	V0,V0,0010	//V0=address of text
ADDU	T8,V0,T7	//T8=address of char
JAL	8009F75C	//returns either -1 or value based on char
LBU	A0,0000 (T8)	//A0=char
BGEZ	V0,8009F8E8	//if a valid char, branch
OR	V1,V0,R0	//V1=V0=value returned
BEQ	R0,R0,8009F9C8
OR	V0,R0,R0
//8009F8E8:	valid char
LW	T9,0028 (SP)	//T9=80142410
LW	T1,028C (T9)	//T1=50
ANDI	T2,T1,0001	//T2=1 if bit toggled
BEQL	T2,R0,8009F92C
	ADDIU	AT,R0,0054
LUI	V0,8013
LBU	V0,62D1 (V0)
ADDIU	AT,R0,0002
BEQ	V0,AT,8009F918
NOP
JAL	800D1A9C
ADDIU	A0,R0,0054
//8009F918

//8009F92C
BNEL	V0,AT,8009F940	//if charval!=54, branch
	LW	A0,0028 (SP)	//A0=80142410
BEQ	R0,R0,8009F950
OR	T0,R0,R0
LW	A0,0028 (SP)
//8009F940:
JAL	8009F800
SW	V1,001C (SP)
LW	V1,001C (SP)
OR	T0,V0,R0	//T0=V0 return value
//8009F950:
SLL	A3,T0,0x10	//A3=T0*0x10000
SRA	A3,A3,0x10	//A3/=0x10000
LW	A0,0028 (SP)	//A0=80142410
LW	A1,002C (SP)	//A1=offset to char
ANDI	A2,V1,00FF	//A2=charval absolutely one byte
JAL	8009F830
SW	V1,001C (SP)
LW	V1,001C (SP)	//V1=charval	(2C)
XORI	V0,V1,0055	//V0=V1^55	(79)
SLTU	V0,R0,V0	//V0=1 if 0<V0
BEQL	V0,R0,8009F9CC
	LW	RA,0014 (SP)
XORI	V0,V1,0050	//V0=V1^50	(7C)
SLTU	V0,R0,V0	//V0=1 if 0<V0
BEQL	V0,R0,8009F9CC
	LW	RA,0014 (SP)
XORI	V0,V1,004E	//V0=V1^4E	(62)
SLTU	V0,R0,V0	//V0=1 if 0<V0
BEQL	V0,R0,8009F9CC
	LW	RA,0014 (SP)
XORI	V0,V1,004F	//V0=V1^4F	(61)
SLTU	V0,R0,V0	//V0=1 if 0<V0
BEQL	V0,R0,8009F9CC
	LW	RA,0014 (SP)
XORI	V0,V1,0052	//V0=V1^52	(7E)
SLTU	V0,R0,V0	//V0=1 if 0<V0
BEQL	V0,R0,8009F9CC
	LW	RA,0014 (SP)
XORI	V0,V1,0054	//V0=V1^54	(78)
SLTU	V0,R0,V0	//V0=1 if 0<V0
LW	RA,0014 (SP)
//8009F9CC:
ADDIU	SP,SP,0028
JR	RA
NOP


subroutines
--------------------
8009DC04:
ADDIU	SP,SP,FFE8
SW	RA,0014 (SP)
OR	A2,A0,R0	//A2=A0=80142410
LW	A0,000C (A2)	//A0=address of text block header
JAL	800903A8
ADDIU	A0,A0,0010	//A0=address of text
LW	RA,0014 (SP)
ADDIU	SP,SP,0018
JR	RA
NOP

-8009034C:	returns V0=1 if not a control character
LBU	V0,0000 (A0)	//V0=char
ADDIU	AT,R0,007F
ADDIU	V1,R0,0001
BNEL	V0,AT,80090390	//if char !=7F control char, branch
ADDIU	AT,R0,0080
LBU	V0,0001 (A0)
BLTZ	V0,80090384
SLTI	AT,V0,0061
BEQ	AT,R0,80090384
SLL	T6,V0,0x1
LUI	V1,8010
ADDU	V1,V1,T6
BEQ	R0,R0,8009039C
LB	V1,6BF4 (V1)	;V1=80106BF4: table of 7F command sizes
//80090384:
BEQ	R0,R0,8009039C
ADDIU	V1,R0,0002
-ADDIU	AT,R0,0080
//80090390:	test if char=80
BNEL	V0,AT,800903A0	//if char !=80 control char, branch
OR	V0,V1,R0
ADDIU	V1,R0,0002
//8009039C:
OR	V0,V1,R0	//V0=V1
JR	RA
NOP

-800903A8:
ADDIU	SP,SP,FFE8
SW	RA,0014 (SP)
OR	A2,A0,R0
JAL	8009034C
ADDU	A0,A2,A1	//A0=address of current char
LW	RA,0014 (SP)
ADDIU	SP,SP,0018
JR	RA
NOP

-8009E6C4:
ADDIU	T6,R0,0001
SB	T6,02D4 (A0)	//1->801426E4
JR	RA
NOP


-8009F730:	returns V0=pointer into a numerical lookup table based on char selected
ADDIU	AT,R0,007F
BEQ	A0,AT,8009F744
ADDIU	AT,R0,0080
BNE	A0,AT,8009F74C
LUI	V0,8010
//8009F744:
JR	RA
ADDIU	V0,R0,FFFF	//V0=-1
//8007F74C:
ADDU	V0,V0,A0	//V0+=char value
LBU	V0,7B90 (V0)	//V0=80107B90+char#
JR	RA
NOP

-8009F75C:
ADDIU	SP,SP,FFE8
SW	RA,0014 (SP)
ADDIU	AT,R0,00CD
BNE	A0,AT,8009F778	//branch if not a \R
NOP
BEQ	R0,R0,8009F780
ADDIU	V0,R0,0053
//8009F778:
JAL	8009F730
NOP
//8009F780:
LW	RA,0014 (SP)
ADDIU	SP,SP,0018
JR	RA
NOP

-8009F800:
LW	V0,0020 (A0)	//V0=80142430=80273B40
OR	V1,R0,R0
BEQL	V0,R0,8009F828	//if pointer NULL, branch
	OR	V0,V1,R0
LBU	T6,0002 (V0)	//T6=80273B42=3
ADDIU	AT,R0,0003
BNEL	T6,AT,8009F828	//if T6!=3, branch
	OR	V0,V1,R0
LW	V1,0930 (V0)	//V1=80274470=0
OR	V0,V1,R0	//V0=V1
//8009F828:
JR	RA
NOP

-8009F830:
SW	A3,000C (SP)
SLL	A3,A3,0x10	//A3*=0x10000
SW	A2,0008 (SP)
ANDI	A2,A2,00FF	//A2=charval absolutely one byte
SRA	A3,A3,0x10	//A3/=0x10000
LW	T6,028C (A0)	//T6=8014269C=50
SW	A1,0274 (A0)	//offset to char->80142684
SB	A2,0278 (A0)	//charval->80142688
ORI	T7,T6,0020	//T7|=20	=70
SH	A3,0272 (A0)	//A3->80142682
SW	T7,028C (A0)	//70->8014269C
JR	RA
NOP


8009FAD4:
ADDIU	SP,SP,FFE8
LUI	V0,8010
ADDIU	V0,V0,7C90	//V0=80107C90
SW	RA,0014 (SP)
LBU	T6,0000 (V0)	//T6=1
ADDIU	AT,R0,0001
ADDIU	T7,R0,0001
BEQ	T6,AT,8009FB00
NOP
BEQ	R0,R0,8009FB1C
SB	T7,0000 (V0)
//8009FB00:
JAL	800D1C98
NOP
ADDIU	AT,R0,0001
BEQL	V0,AT,8009FB20
	LW	RA,0014 (SP)
JAL	800D1C70
ADDIU	A0,R0,0001
//8009FB1C:
LW	RA,0014 (SP)
//8009FB20:
ADDIU	SP,SP,0018
JR	RA
NOP

-800A3190:
ADDIU	SP,SP,FFE8
SW	RA,0014 (SP)
LW	V0,02AC (A0)
BLTZ	V0,800A31C8
SLTI	AT,V0,0008
BEQ	AT,R0,800A31C8
SLL	T6,V0,0x2
LUI	V1,8011
ADDU	V1,V1,T6
LW	V1,AE00 (V1)
BEQL	V1,R0,800A31CC
LW	RA,0014 (SP)
JALR	RA,V1
NOP
//800A31C8:
LW	RA,0014 (SP)
ADDIU	SP,SP,0018
JR	RA
NOP


-800D1C98:
ADDIU	SP,SP,FFE8
SW	RA,0014 (SP)
JAL	800F9C54
NOP
LW	RA,0014 (SP)
ADDIU	SP,SP,0018
JR	RA
NOP

-800F9C54:	80113894->V0
LUI	V0,8011
JR	RA
LBU	V0,3894 (V0)


-800A054C:
ADDIU	SP,SP,FFE8
SW	RA,0014 (SP)
LW	T6,02C0 (A0)	//T6=80142410+2C0=0
BEQL	T6,R0,800A0598
	OR	V0,R0,R0
LW	T7,02BC (A0)
BNEL	T7,R0,800A0598
	OR	V0,R0,R0
JAL	80078DAC	;TRUE if buttons A0 held
ORI	A0,R0,8000
BNEZ	V0,800A058C
NOP
//800A057C:
JAL	80078DAC	;TRUE if buttons A0 held
ADDIU	A0,R0,4000
BEQL	V0,R0,800A0598
	OR	V0,R0,R0
//800A058C:
BEQ	R0,R0,800A0598
ADDIU	V0,R0,0001
OR	V0,R0,R0
//800A0598:	RETURN
LW	RA,0014 (SP)
ADDIU	SP,SP,0018
JR	RA
NOP

800A05A8:	returns V0=1 if char is 7F control; otherwise, V0=0
LW	V0,000C (A0)	//V0=80142410+C=address for start of text buffer header=80141FF0
ADDIU	AT,R0,007F
ADDIU	V0,V0,0010	//V0=start of text
ADDU	T6,V0,V1	//T6=current text char addy
LBU	V1,0000 (T6)	//V1=current char
OR	V0,R0,R0
BNE	V1,AT,800A05D0	//if current char is not 7F control char, branch
NOP
JR	RA
ADDIU	V0,R0,0001
//800A05D0:
JR	RA
NOP
